This a partial patch -- you're expected to hand-munge the code.

You will also be required to generate the logo.h file thusly:
  $ ./img2prog.py logo.png >logo.h
It takes a 128x64 bitmap in any common format.

The code for a musical easter-egg is in this too.. but has a clicking
issue atm.

--
Chris Baird,, <chris.j.baird@gmail.com> June 2024.


diff -U5 -t --suppress-blank-empty -r -N -E -Z -b -w -B uv-k5-firmware-custom/Makefile /home/cjb/uvk2cjb/Makefile
--- uv-k5-firmware-custom/Makefile	2024-06-23 14:06:24.069184668 +1000
+++ /home/cjb/uvk2cjb/Makefile	2024-06-01 17:37:37.418261807 +1000

+# ---- CJB MODS ----
+ENABLE_SPLASH                 ?= 1

@@ -385,1 +395,5 @@

+# CJB mods
+ifeq ($(ENABLE_SPLASH),1)
+        CFLAGS += -DENABLE_SPLASH
+endif


Making this parse original C64 Sidplayer .MUS files is an eventual goal..

diff -U5 -t --suppress-blank-empty -r -N -E -Z -b -w -B uv-k5-firmware-custom/audio.c /home/cjb/uvk2cjb/audio.c
--- uv-k5-firmware-custom/audio.c	2024-06-23 14:06:24.069184668 +1000
+++ /home/cjb/uvk2cjb/audio.c	2024-05-31 21:23:20.543112318 +1000
@@ -28,0 +28,0 @@

+#include "utils/music.h"
+
+void AUDIO_meep(void)
+{
+  AUDIO_AudioPathOff();
+  SYSTEM_DelayMs(20);
+
+  uint16_t ToneConfig = BK4819_ReadRegister(BK4819_REG_71);
+  AUDIO_AudioPathOn();
+
+  for (const uint8_t *musicp = musicdata; *musicp != 255; musicp += 4)
+ {
+      int freq = musicp[1] + (musicp[0] << 8); /* in Hz */
+      int dur  = musicp[3] + (musicp[2] << 8); /* in 1/100s */
+      dur *= 5;
+      BK4819_PlaySingleTone(freq, dur, 64, true);
+    }
+
+  AUDIO_AudioPathOff();
+  SYSTEM_DelayMs(5);
+  BK4819_TurnsOffTones_TurnsOnRX();
+  SYSTEM_DelayMs(5);
+  BK4819_WriteRegister(BK4819_REG_71, ToneConfig);
+}


diff -U5 -t --suppress-blank-empty -r -N -E -Z -b -w -B uv-k5-firmware-custom/audio.h /home/cjb/uvk2cjb/audio.h
--- uv-k5-firmware-custom/audio.h	2024-06-23 14:06:24.069184668 +1000
+++ /home/cjb/uvk2cjb/audio.h	2024-05-31 14:28:56.863574007 +1000
@@ -139,1 +139,2 @@

+extern void AUDIO_meep(void);


diff -U5 -t --suppress-blank-empty -r -N -E -Z -b -w -B uv-k5-firmware-custom/ui/welcome.c /home/cjb/uvk2cjb/ui/welcome.c
--- uv-k5-firmware-custom/ui/welcome.c	2024-06-23 14:06:24.297187760 +1000
+++ /home/cjb/uvk2cjb/ui/welcome.c	2024-06-08 16:35:20.865045149 +1000
@@ -16,1 +17,4 @@

+#include "driver/system.h"
+#include "driver/backlight.h"
+#include "audio.h"

@@ -43,6 +51,7 @@
 {
         char WelcomeString0[16];
         char WelcomeString1[16];

         memset(gStatusLine, 0, sizeof(gStatusLine));
+        BACKLIGHT_TurnOn();
         UI_DisplayClear();

I started with RLE support, but it wasn't advantageous. -cjb

-        if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_NONE || gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_FULL_SCREEN) {
-                ST7565_FillScreen(0xFF);
-        } else {
+  if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_FULL_SCREEN)
+    {
+#ifdef ENABLE_SPLASH
+#include "utils/logo.h"
+      for (int m = 4; m < LCD_WIDTH; m += 1)
+        {
+#ifdef UNCOMPRESSED_SPLASH
+          for (int yy = 0; yy < 7; yy += 1)
+            {
+              memset (gStatusLine, 0, m);
+              memcpy (gStatusLine+LCD_WIDTH-m, logo_bitmap, m);
+
+              uint8_t* p = (void*)gFrameBuffer + (yy * LCD_WIDTH);
+              memset (p, 0, m);
+              memcpy (p+LCD_WIDTH-m, logo_bitmap+((yy+1)*LCD_WIDTH), m);
+            }
+          ST7565_BlitStatusLine();
+          ST7565_BlitFullScreen();
+          SYSTEM_DelayMs(25);
+        }
+#endif
+    }
+  SYSTEM_DelayMs(1500);
+#endif
+  if (gF_LOCK)
+    AUDIO_meep();
+
+  if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_NONE)
+    {
+      for (int i = 0; i < 256; i++)
+        ST7565_FillScreen((unsigned char)i);
+    }


..and this is the script to create the logo.h data..

diff -U5 -t --suppress-blank-empty -r -N -E -Z -b -w -B uv-k5-firmware-custom/utils/image2prg.py /home/cjb/uvk2cjb/utils/image2prg.py
--- uv-k5-firmware-custom/utils/image2prg.py	1970-01-01 10:00:00.000000000 +1000
+++ /home/cjb/uvk2cjb/utils/image2prg.py	2024-05-25 15:30:09.629314758 +1000
@@ -0,0 +1,56 @@
+#!/usr/bin/python3
+# Converts 128x64x1bpp bitmaps into C header data
+# --
+# Chris Baird <chris.j.baird@gmail.com> did this, 2017-2024.
+# Licenced according to the GPLv3
+
+import sys
+import binascii
+
+mem = [0] * 1024
+pixels = ( 1, 2, 4, 8, 16, 32, 64, 128 )
+
+def memplot (x, y):
+  plot_addr = ((y >> 3)*128) + x
+  mem[plot_addr] |= pixels[y & 7];
+
+from PIL import Image, ImageFilter
+im = Image.open(sys.argv[1]).convert('RGB')
+if im.size != (128,64):
+  print ("image not 128x64-- get the Gimp out, matey. exiting")
+  sys.exit()
+
+for y in range(0,64):
+  for x in range(0,128):
+    if not im.getpixel((x,y))[0]:
+      memplot(x,y)
+
+p = 0
+l = 0
+lb = -1
+out = ""
+
+for p in range(0,1024):
+  b = mem[p]
+  out = out + chr(b)
+
+print ("\n#define UNCOMPRESSED_SPLASH 1")
+print ("const unsigned char logo_bitmap[] = { ")
+
+tb = 0
+for i in range(0,len(out)):
+  if tb == 0:
+    line = "    "
+  c = str(ord(out[i:i+1]))
+  line = line + str(c)+ ","
+  tb = tb + 1
+  if (i == len(out)-1) | len (line) > 70:
+    print (line)
+    tb = 0
+    # TODO - add commas properly
+
+print (line.rstrip(","), "\n};\n")
+
+######################################################################

You're going to want to replace this.. but just getting code to build at
the start is important too..

diff -U5 -t --suppress-blank-empty -r -N -E -Z -b -w -B uv-k5-firmware-custom/utils/logo.h /home/cjb/uvk2cjb/utils/logo.h
--- uv-k5-firmware-custom/utils/logo.h	1970-01-01 10:00:00.000000000 +1000
+++ /home/cjb/uvk2cjb/utils/logo.h	2024-05-25 19:48:53.018427441 +1000
@@ -0,1 +1,47 @@

+#define UNCOMPRESSED_SPLASH 1
+const unsigned char logo_bitmap[] = {
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,192,
+    192,192,192,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,128,192,192,192,192,64,0,128,192,192,192,192,192,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,192,192,192,192,192,192,192,
+    192,64,0,0,0,0,0,0,0,0,128,128,128,192,192,192,192,192,192,192,192,
+    192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
+    128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,1,3,7,15,31,63,126,252,248,240,
+    224,192,128,0,0,0,0,0,0,0,0,0,0,128,192,224,240,248,252,126,63,31,15,
+    7,3,1,0,0,0,255,255,255,255,255,255,224,224,224,224,224,240,240,240,
+    248,248,248,252,188,156,158,30,14,15,15,7,7,7,3,3,3,1,1,1,0,0,0,0,0,
+    0,0,0,0,0,30,31,31,159,159,135,129,193,193,193,193,193,193,193,193,
+    193,193,193,193,193,193,193,193,193,193,193,193,225,225,243,255,255,
+    127,127,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,3,7,15,31,62,124,
+    120,120,112,120,124,62,31,15,7,3,3,1,0,0,0,0,0,0,0,0,0,0,0,63,127,127,
+    127,127,63,0,0,0,0,0,0,0,1,1,1,3,3,3,7,7,7,15,15,14,30,28,28,60,56,
+    56,120,112,112,112,96,96,96,0,0,0,0,0,0,126,127,127,127,127,115,115,
+    113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,
+    113,113,113,113,112,112,112,112,112,112,112,0,0,0,0,0,0,0,0,0,0,0,192,
+    240,248,248,252,252,28,28,12,14,14,14,14,14,14,14,14,14,14,14,14,14,
+    14,14,14,14,14,14,14,28,28,124,252,252,248,240,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,254,254,254,254,0,0,
+    0,0,0,252,254,254,254,254,254,14,14,14,14,14,14,14,14,14,14,14,14,14,
+    14,14,14,14,14,14,14,14,12,28,156,252,252,248,248,240,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,31,127,255,255,255,253,192,128,128,128,128,128,128,
+    128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+    192,240,240,240,240,112,0,0,0,0,0,0,120,248,248,248,248,192,128,128,
+    128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+    224,255,255,255,255,127,0,0,0,0,0,255,255,255,255,255,255,135,135,135,
+    135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+    135,135,135,135,207,255,255,255,252,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,
+    0,0,0,0,0,0,0,0,0,0,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+    3,1,1,0,0,0,0,0,0,0,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+    3,3,3,3,3,3,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0
+};

Or create your own. Has to be 128x64 1bpp.

Binary files uv-k5-firmware-custom/utils/logo.png and /home/cjb/uvk2cjb/utils/logo.png differ
